/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.cip.esymons.tesoreria.beans;

import org.cip.esymons.general.util.ControladorAbstracto;
import cip.util.PaginacionFiltro;
import java.util.ArrayList;
import java.util.List;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;
import org.cip.esymons.general.be.PersonaJuridica;
import org.cip.esymons.general.be.PersonaNatural;
import org.cip.esymons.general.be.Solicitante;
import org.cip.esymons.tesoreria.bc.CuentaBancariaDelegate;

import org.cip.esymons.tesoreria.bc.TipoMonedaDelegate;
import org.cip.esymons.tesoreria.be.CuentaBancaria;
import org.cip.esymons.tesoreria.be.CuentaContable;

import org.cip.esymons.tesoreria.be.EnumEstadoCuentaBancaria;
import org.cip.esymons.tesoreria.be.EnumTipoCuentaBancaria;
import org.cip.esymons.tesoreria.be.TipoMoneda;

/**
 *
 * @author Ingrid Capuñay
 */
public class CuentaBancariaController extends ControladorAbstracto {

    private String cuentaPerteneceA; /*Cip=CIP ; PersonaEmpresa=Personas o Empresas*/

    private CuentaBancariaDelegate delegadoCueBan;
    private TipoMonedaDelegate delegadoTipoMoneda;
    private CuentaBancaria cuentaBancaria;
    private PersonaNatural personaSeleccionada;
    private PersonaJuridica empresaSeleccionada;
    private Solicitante solicitanteSeleccionado;
    private CuentaContable cuentaContableSeleccionada;
    private String nombreCuentaContable;
    private MiPaginador paginador;
    private String numCuentaBancariaIngresada;

    public CuentaBancariaController() {
        delegadoCueBan = new CuentaBancariaDelegate();
        delegadoTipoMoneda=new TipoMonedaDelegate();
        cuentaPerteneceA="Cip";
        paginador = new MiPaginador<CuentaBancaria>(null, 20);
        paginador.setFilter("");
        paginador.tipoMonedaSeleccionada=delegadoTipoMoneda.buscarMonedaDefecto();
        paginador.estadoCuentaBancariaSeleccionado=EnumEstadoCuentaBancaria.ACTIVA;

    }

    public CuentaBancaria buscarPorCodigo(Long codigo) {
        return delegadoCueBan.find(codigo);
    }

    /**
     * @return the paginador
     */
    public MiPaginador getPaginador() {
        return paginador;
    }

    /**
     * @param paginador the paginador to set
     */
    public void setPaginador(MiPaginador paginador) {
        this.paginador = paginador;
    }

    /**
     * @return the solicitanteSeleccionado
     */
    public Solicitante getSolicitanteSeleccionado() {
        return solicitanteSeleccionado;
    }

    /**
     * @param solicitanteSeleccionado the solicitanteSeleccionado to set
     */
    public void setSolicitanteSeleccionado(Solicitante solicitanteSeleccionado) {
        this.solicitanteSeleccionado = solicitanteSeleccionado;
    }

    /**
     * @return the cuentaContableSeleccionada
     */
    public CuentaContable getCuentaContableSeleccionada() {
        return cuentaContableSeleccionada;
    }

    /**
     * @param cuentaContableSeleccionada the cuentaContableSeleccionada to set
     */
    public void setCuentaContableSeleccionada(CuentaContable cuentaContableSeleccionada) {
        this.cuentaContableSeleccionada = cuentaContableSeleccionada;
    }

    /**
     * @return the nombreCuentaContable
     */
    public String getNombreCuentaContable() {
        return nombreCuentaContable;
    }

    /**
     * @param nombreCuentaContable the nombreCuentaContable to set
     */
    public void setNombreCuentaContable(String nombreCuentaContable) {
        this.nombreCuentaContable = nombreCuentaContable;
    }

    /**
     * @return the numCuentaBancariaIngresada
     */
    public String getNumCuentaBancariaIngresada() {
        return numCuentaBancariaIngresada;
    }

    /**
     * @param numCuentaBancariaIngresada the numCuentaBancariaIngresada to set
     */
    public void setNumCuentaBancariaIngresada(String numCuentaBancariaIngresada) {
        this.numCuentaBancariaIngresada = numCuentaBancariaIngresada;
    }

    public final class MiPaginador<k> extends PaginacionFiltro {

        private EnumTipoCuentaBancaria tipoCuentaBancariaSeleccionada = null;
        private TipoMoneda tipoMonedaSeleccionada = null;
        private PersonaJuridica bancoSeleccionado = null;
        private EnumEstadoCuentaBancaria estadoCuentaBancariaSeleccionado = null;


        public MiPaginador(String action, int cantidad) {
            super(action, cantidad);

        }

        @Override
        public int contar() throws Exception {
            try {
                return delegadoCueBan.contarBuscarCuentaBancaria(
                        cuentaPerteneceA, personaSeleccionada, empresaSeleccionada, tipoCuentaBancariaSeleccionada, tipoMonedaSeleccionada, bancoSeleccionado, estadoCuentaBancariaSeleccionado);
            } catch (Exception ex) {
                return 0;
            }
        }

        @Override
        public List listar() throws Exception {
            try {
                return delegadoCueBan.buscarCuentaBancaria(getPaginador().getCantidadxPagina(), getPaginador().getPosicion(),
                        cuentaPerteneceA, personaSeleccionada, empresaSeleccionada, tipoCuentaBancariaSeleccionada, tipoMonedaSeleccionada, bancoSeleccionado, estadoCuentaBancariaSeleccionado);
            } catch (Exception ex) {
                return new ArrayList();
            }
        }

        /**
         * @return the tipoMonedaSeleccionada
         */
        public TipoMoneda getTipoMonedaSeleccionada() {
            return tipoMonedaSeleccionada;
        }

        /**
         * @param tipoMonedaSeleccionada the tipoMonedaSeleccionada to set
         */
        public void setTipoMonedaSeleccionada(TipoMoneda valor) {
            try {
                if (!valor.equals(tipoMonedaSeleccionada)) {
                    tipoMonedaSeleccionada = valor;
                    reset();
                }
            } catch (Exception ex) {
                tipoMonedaSeleccionada = null;
            }
        }

        /**
         * @return the tipoCuentaBancariaSeleccionada
         */
        public EnumTipoCuentaBancaria getTipoCuentaBancariaSeleccionada() {
            return tipoCuentaBancariaSeleccionada;
        }

        /**
         * @param tipoCuentaBancariaSeleccionada the tipoCuentaBancariaSeleccionada to set
         */
        public void setTipoCuentaBancariaSeleccionada(EnumTipoCuentaBancaria valor) {
            try {
                if (!valor.equals(tipoCuentaBancariaSeleccionada)) {
                    tipoCuentaBancariaSeleccionada = valor;
                    reset();
                }
            } catch (Exception ex) {
                tipoCuentaBancariaSeleccionada = null;
            }
        }

        /**
         * @return the bancoSeleccionado
         */
        public PersonaJuridica getBancoSeleccionado() {
            return bancoSeleccionado;
        }

        /**
         * @param bancoSeleccionado the bancoSeleccionado to set
         */
        public void setBancoSeleccionado(PersonaJuridica valor) {
            try {
                if (!valor.equals(bancoSeleccionado)) {
                    bancoSeleccionado = valor;
                    reset();
                }
            } catch (Exception ex) {
                bancoSeleccionado = null;
            }
        }

        /**
         * @return the estadoCuentaBancariaSeleccionado
         */
        public EnumEstadoCuentaBancaria getEstadoCuentaBancariaSeleccionado() {
            return estadoCuentaBancariaSeleccionado;
        }

        /**
         * @param estadoCuentaBancariaSeleccionado the estadoCuentaBancariaSeleccionado to set
         */
        public void setEstadoCuentaBancariaSeleccionado(EnumEstadoCuentaBancaria valor) {
            try {
                if (!valor.equals(estadoCuentaBancariaSeleccionado)) {
                    estadoCuentaBancariaSeleccionado = valor;
                    reset();
                }
            } catch (Exception ex) {
                estadoCuentaBancariaSeleccionado = null;
            }
        }
    }

    /**
     * @return the cuentaPerteneceA
     */
    public String getCuentaPerteneceA() {
        return cuentaPerteneceA;
    }

    /**
     * @param cuentaPerteneceA the cuentaPerteneceA to set
     */
    public void setCuentaPerteneceA(String cuentaPerteneceA) {
        this.cuentaPerteneceA = cuentaPerteneceA;
    }

    public void limpiarCajaTexto(ValueChangeEvent event) {
        personaSeleccionada = null;
        empresaSeleccionada = null;
    }

    public String limpiarParaBusqueda() {
        personaSeleccionada = null;
        empresaSeleccionada = null;
        solicitanteSeleccionado = null;
        cuentaPerteneceA = null;
        paginador.bancoSeleccionado = null;
        paginador.estadoCuentaBancariaSeleccionado = null;
        paginador.tipoCuentaBancariaSeleccionada = null;
        paginador.tipoMonedaSeleccionada = null;
        paginador.reset();
        return null;
    }

    public SelectItem[] getEstadoCuentaBancariaItems() {
        try {
            SelectItem[] select = new SelectItem[EnumEstadoCuentaBancaria.values().length];
            int cont = 0;
            for (EnumEstadoCuentaBancaria e : EnumEstadoCuentaBancaria.values()) {
                select[cont] = new SelectItem(e, e.name());
                cont++;
            }
            return select;
        } catch (Exception ex) {
            SelectItem[] select = new SelectItem[1];
            select[0] = new SelectItem(null, "No existen Estados");
            return select;
        }
    }

    public SelectItem[] getTipoCuentaBancariaItems() {
        try {
            SelectItem[] select = new SelectItem[EnumTipoCuentaBancaria.values().length];
            int cont = 0;
            for (EnumTipoCuentaBancaria e : EnumTipoCuentaBancaria.values()) {
                select[cont] = new SelectItem(e, e.name());
                cont++;
            }
            return select;
        } catch (Exception ex) {
            SelectItem[] select = new SelectItem[1];
            select[0] = new SelectItem(null, "No existen Tipos de Cuentas");
            return select;
        }
    }

    /**
     * @return the cuentaBancaria
     */
    public CuentaBancaria getCuentaBancaria() {
        return cuentaBancaria;
    }

    /**
     * @param cuentaBancaria the cuentaBancaria to set
     */
    public void setCuentaBancaria(CuentaBancaria cuentaBancaria) {
        this.cuentaBancaria = cuentaBancaria;
    }

    public String busquedaPropietarioCuentaBuscar() {
        personaSeleccionada = null;
        empresaSeleccionada = null;
        solicitanteSeleccionado = null;
        BusquedaPersonasController bpcCB = (BusquedaPersonasController) getBean("busquedaPersonasController");
        bpcCB.setControladorSolicitante(3);
        bpcCB.setApeMatPerNat(null);
        bpcCB.setApePatPerNat(null);
        bpcCB.setDniPerNat(null);
        bpcCB.setNomPerNat(null);
        bpcCB.setRazsocPerJur(null);
        bpcCB.setRucCliente(null);
        bpcCB.setTipoPersonaSeleccionada("NA");

        return "busquedaPropietarioCuenta";
    }

    public String busquedaPropietarioCuentaNuevo() {
        numCuentaBancariaIngresada = null;
        personaSeleccionada = null;
        empresaSeleccionada = null;
        solicitanteSeleccionado = null;
        BusquedaPersonasController bpcCB = (BusquedaPersonasController) getBean("busquedaPersonasController");
        bpcCB.setControladorSolicitante(2);
        bpcCB.setApeMatPerNat(null);
        bpcCB.setApePatPerNat(null);
        bpcCB.setDniPerNat(null);
        bpcCB.setNomPerNat(null);
        bpcCB.setRazsocPerJur(null);
        bpcCB.setRucCliente(null);
        bpcCB.setTipoPersonaSeleccionada("NA");

        return "busquedaPropietarioCuenta";
    }

    /**
     * @return the personaSeleccionada
     */
    public PersonaNatural getPersonaSeleccionada() {
        return personaSeleccionada;
    }

    /**
     * @param personaSeleccionada the personaSeleccionada to set
     */
    public void setPersonaSeleccionada(PersonaNatural personaSeleccionada) {
        this.personaSeleccionada = personaSeleccionada;
    }

    /**
     * @return the empresaSeleccionada
     */
    public PersonaJuridica getEmpresaSeleccionada() {
        return empresaSeleccionada;
    }

    /**
     * @param empresaSeleccionada the empresaSeleccionada to set
     */
    public void setEmpresaSeleccionada(PersonaJuridica empresaSeleccionada) {
        this.empresaSeleccionada = empresaSeleccionada;
    }

    public String nuevo() {
        cuentaBancaria = new CuentaBancaria();
        return "nuevo";
    }

    public String anular() {

        cuentaBancaria.setCbaEstado(EnumEstadoCuentaBancaria.ANULADA);
        delegadoCueBan.edit(cuentaBancaria);
        paginador.reset();
        return null;
    }

    public String buscar() {

        paginador.reset();
        return null;
    }

    public String actualizar() {

        delegadoCueBan.edit(cuentaBancaria);
        cuentaPerteneceA = null;
        personaSeleccionada = null;
        empresaSeleccionada = null;
        paginador.tipoCuentaBancariaSeleccionada = null;
        paginador.bancoSeleccionado = null;
        paginador.estadoCuentaBancariaSeleccionado = null;
        paginador.tipoMonedaSeleccionada = null;
        paginador.reset();
        ControladorAbstracto.info("Se insertó satisfactoriamente la Cuenta Bancaria.");
        return "pagebuscar";
    }

    public String grabar() {
        cuentaBancaria.setCbaNumcuenta(numCuentaBancariaIngresada);
        cuentaBancaria.setCbaTipocuenta(paginador.getTipoCuentaBancariaSeleccionada());
        cuentaBancaria.setFkBanCodigo(paginador.getBancoSeleccionado());
        cuentaBancaria.setFkTmoCodigo(paginador.getTipoMonedaSeleccionada());
        cuentaBancaria.setCbaEstado(EnumEstadoCuentaBancaria.ACTIVA);
        if (cuentaPerteneceA.equals("Cip")) {
            cuentaBancaria.setCuentaContableRelacionada(cuentaContableSeleccionada);
        } else {
            if (personaSeleccionada != null) {
                cuentaBancaria.setPropietarioCuentaBancaria(personaSeleccionada);
            }
            if (empresaSeleccionada != null) {
                cuentaBancaria.setPropietarioCuentaBancaria(empresaSeleccionada);
            }
        }

        delegadoCueBan.create(cuentaBancaria);
        cuentaPerteneceA = null;
        personaSeleccionada = null;
        empresaSeleccionada = null;
        paginador.tipoCuentaBancariaSeleccionada = null;
        paginador.bancoSeleccionado = null;
        paginador.estadoCuentaBancariaSeleccionado = null;
        paginador.tipoMonedaSeleccionada = null;
        paginador.reset();
        ControladorAbstracto.info("Se actualizó satisfactoriamente la Cuenta Bancaria.");
        return "buscar";
    }
}
